/*
 * Fichier: TriBulle.java
 * Crée le: 13 décembre 2006.
 * Modifié: 7 juillet 2007.
 * Auteurs: Sébastien ESTIENNE.
 * SiteWeb: http://www.prog-info.org/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package chapitre6;



import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;



/**
 * <p>Tri bulle amélioré.</p>
 * @author Sébastien ESTIENNE.
 */
public class TriBulle extends JFrame
{
   /**
    * <p>Serial version UID.</p>
    */
   private static final long serialVersionUID = 1L;


   /**
    * <p>Construction de l'application.</p>
    */
   public TriBulle()
   {
      // Appel du constructeur de la classe JFrame.
      super("Tri Bulle");

      // Obtenir le panneau de contenu et changer son layout en un FlowLayout.
      Container conteneur = getContentPane();
      conteneur.setLayout(new BorderLayout());

      // Zone de texte de sortie.
      JTextArea zoneSortie = new JTextArea();
      zoneSortie.setEditable(false);

      // Ajoute la zone de sortie au conteneur.
      conteneur.add(new JScrollPane(zoneSortie));

      // Tableau des valeurs à trier.
      int[] tableau = {5, 56, 34, 43, 17, 25, 8, 65, 31, 52};

      // Chaine de caractère de sortie.
      StringBuilder sortie = new StringBuilder();

      // Ajoute à la chaine de sortie les valeurs de départ du tableau.
      sortie.append("Valeurs de départ du tableau:\n");
      for(int i = 0; i < tableau.length; i++)
      {
         sortie.append("  ").append(tableau[i]);
      }

      // Trie le tableau.
      triBulle(tableau);

      // Ajoute à la chaine de sortie les valeurs triées du tableau.
      sortie.append("\n\n");
      sortie.append("Valeurs triées du tableau:\n");
      for(int i = 0; i < tableau.length; i++)
      {
         sortie.append("  ").append(tableau[i]);
      }

      // Met à jour la zone de sortie.
      zoneSortie.setText(sortie.toString());

      // Modifie les propriétés de la fenêtre.
      setSize(300, 150);
      setLocation(100, 100);
      setVisible(true);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }


   /**
    * <p>Effectue un tri bulle.</p>
    * @param tableau Les valeurs à trier.
    */
   public void triBulle(int[] tableau)
   {
      // Nombre de passages nécessaires pour trier le tableau d'entiers.
      for(int i = 1; i < tableau.length; i++)
      {
         // Indique s'il faut continuer le tri ou non.
         boolean continuer = false;

         // Un passage dans le tableau permettant de trier un élément.
         for(int j = 0; j < tableau.length - i; j++)
         {
            // Compare une paire d'éléments et les permutte si le premier est supérieur au second.
            if(tableau[j] > tableau[j + 1])
            {
               permuter(tableau, j, j + 1);
               continuer = true;
            }
         }

         // Si aucune permutation n'a été effectuée, alors le tableau est déjà trié.
         if(!continuer)
         {
            break;
         }
      }
   }


   /**
    * <p>Permutte deux éléments d'un tableau.</p>
    * @param tableau Le tableau concerné.
    * @param i L'indice du premier élément.
    * @param j L'indice du second élément.
    */
   public void permuter(int[] tableau, int i, int j)
   {
      // Variable temporaire pour la permutation.
      int temp;

      temp = tableau[i];
      tableau[i] = tableau[j];
      tableau[j] = temp;
   }


   /**
    * <p>Lance l'application.</p>
    * @param args Les paramètres de la ligne de commande.
    */
   public static void main(String[] args)
   {
      new TriBulle();
   }
}
